package com.zx.framework.core.util;

import java.io.UnsupportedEncodingException;

import org.apache.commons.lang3.StringUtils;
/**
 * StringUtil的扩展类
 * @author stylewolf
 *
 */
public class StringUtil extends StringUtils {
	/**
	 * 首字母大写
	 * 
	 * @param input
	 * @return
	 */
	public static String firstToUpperCase(String input) {
		if (isEmpty(input)) {
			return "";
		}

		String first = Character.toString(input.charAt(0))
				.toUpperCase();
		String rest = input.substring(1);
		return first + rest;
	}

	/**
	 * 首字母小写
	 * 
	 * @param input
	 * @return
	 */
	public static String firstToLowerCase(String input) {
		if (isEmpty(input)) {
			return "";
		}

		String first = Character.toString(input.charAt(0))
				.toLowerCase();
		String rest = input.substring(1);
		return first + rest;
	}
	
	/**
	 * 半角转全角，必须将异常抛给调用者处理
	 * 
	 * @param input
	 * @return
	 * @throws UnsupportedEncodingException
	 */
	public static final String full2HalfChange(String input) throws UnsupportedEncodingException {
		StringBuffer sb = new StringBuffer("");
		String tempString = "";
		byte[] b = null;
		for (int i = 0; i < input.length(); i++) {
			tempString = input.substring(i, i + 1);
			// 全角空格转换成半角空格
			if (tempString.equals("　")) {
				sb.append(" ");
				continue;
			}
			b = tempString.getBytes("unicode");
			// 得到 unicode 字节数据
			if (b[2] == -1) {
				// 表示全角？
				b[3] = (byte) (b[3] + 32);
				b[2] = 0;
				sb.append(new String(b,"unicode"));
			} else {
				sb.append(tempString);
			}
		}
		return sb.toString();
	}
	
	/**
	 * 半角转全角，必须将异常抛给调用者处理
	 * @param input
	 * @return
	 * @throws UnsupportedEncodingException 
	 */
	public static final String half2Fullchange(String input) throws UnsupportedEncodingException {
		StringBuffer sb = new StringBuffer("");
		String tempString = "";
		byte[] b = null;
		for (int i = 0; i < input.length(); i++) {
			tempString = input.substring(i, i + 1);
			if (tempString.equals(" ")) {
				// 半角空格
				sb.append(tempString);
				continue;
			}
			b = tempString.getBytes("unicode");
			if (b[2] == 0) {
				// 半角?
				b[3] = (byte) (b[3] - 32);
				b[2] = -1;
				sb.append(new String(b,
						"unicode"));
			} else {
				sb.append(tempString);
			}
		}
		return sb.toString();
	}
	
	/**
	 * 判断一个字符是Ascill字符还是其它字符（如汉，日，韩文字符）
	 * 
	 * @param char c, 需要判断的字符
	 * @return boolean, 返回true,Ascill字符
	 */
	public static boolean isLetter(char c) {
		int k = 0x80;
		return c / k == 0 ? true : false;
	}

	/**
	 * 得到一个字符串的长度,显示的长度,一个汉字或日韩文长度为2,英文字符长度为1
	 * 
	 * @param String
	 *                s ,需要得到长度的字符串
	 * @return int, 得到的字符串长度
	 */
	public static int length(String s) {
		if (s == null)
			return 0;
		char[] c = s.toCharArray();
		int len = 0;
		for (int i = 0; i < c.length; i++) {
			len++;
			if (!isLetter(c[i])) {
				len++;
			}
		}
		return len;
	}

	/**
	 * 截取一段字符的长度,不区分中英文,如果数字不正好，则少取一个字符位
	 * 
	 * @author patriotlml
	 * @param String
	 *                origin, 原始字符串
	 * @param int len, 截取长度(一个汉字长度按2算的)
	 * @return String, 返回的字符串
	 */
	public static String substring(String origin, int len) {
		if (origin == null || origin.equals("") || len < 1)
			return "";
		byte[] strByte = new byte[len];
		if (len > length(origin)) {
			return origin;
		}
		System.arraycopy(origin.getBytes(), 0, strByte, 0, len);
		int count = 0;
		for (int i = 0; i < len; i++) {
			int value = (int) strByte[i];
			if (value < 0) {
				count++;
			}
		}
		if (count % 2 != 0) {
			len = (len == 1) ? ++len : --len;
		}
		return new String(strByte, 0, len);
	}
}
